定義で複数のタイプが混ざっている場合( Union )があります。
Foo
というタイプはA
とB
、C
の Union だと仮にします。そしてA
とB
はname
というフィールドが含まれてますが、C
にはそれが無いといいうような場合、C
の時に解決できないのでname
フィールドを指定できません。
# 仮
{
foo: {
name
}
}
こんな場合は Union を分解して「A
の時はこのフィールド」...「C
の時はこのフィールド」と別々に構造を決める仕組みがあります。これは Inline Fragment と呼ばれます。
Inline Fragment は ... on Type { ... }
という形になります。Type
にはA|B|C
、{}
の中にはそれらが持つフィールドを記述します。
上の例を動くように書き直すと以下のようになります。
{
foo: {
... on A {
name
}
... on B {
name
}
... on C {
# ...
}
}
}
GitHub API v4 での例だとこんな実例があります。
{
search(query: "foo", type: REPOSITORY, first: 1) {
edges {
node {
... on Repository {
id
name
}
}
}
}
}